﻿using System.Collections.Generic;
using Insesoft.Entities;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace InseSoft.Tests.Unit.Entities
{
    [TestClass]
    public class UsuarioTest
    {
        [TestMethod]
        public void EmptyInstance_Called2Times_SameInstanceReturned()
        {
            var instance1 = Usuario.EmptyInstance;
            var instance2 = Usuario.EmptyInstance;

            Assert.AreSame(instance1, instance2);
        }

        [TestMethod]
        public void Equals_SameEmpresaAndNombreUsuario_ReturnsTrue()
        {
            var empresa = new Empresa { Id = 1 };
            const string nombreUsuario = "user1";
            var entity1 = new Usuario { Empresa = empresa, NombreUsuario = nombreUsuario, Nombre = "Nombre1" };
            var entity2 = new Usuario { Empresa = empresa, NombreUsuario = nombreUsuario, Nombre = "Nombre2" };

            Assert.IsTrue(entity1.Equals(entity2));
        }

        [TestMethod]
        public void Equals_DifferentNombreUsuario_ReturnsFalse()
        {
            var empresa = new Empresa { Id = 1 };
            const string nombreUsuario1 = "user1";
            const string nombreUsuario2 = "user2";
            var entity1 = new Usuario { Empresa = empresa, NombreUsuario = nombreUsuario1, Nombre = "Nombre" };
            var entity2 = new Usuario { Empresa = empresa, NombreUsuario = nombreUsuario2, Nombre = "Nombre" };

            Assert.IsFalse(entity1.Equals(entity2));
        }

        [TestMethod]
        public void Equals_DifferentEmpresaUsuario_ReturnsFalse()
        {
            var empresa1 = new Empresa { Id = 1 };
            var empresa2 = new Empresa { Id = 2 };
            const string nombreUsuario = "user1";
            var entity1 = new Usuario { Empresa = empresa1, NombreUsuario = nombreUsuario, Nombre = "Nombre" };
            var entity2 = new Usuario { Empresa = empresa2, NombreUsuario = nombreUsuario, Nombre = "Nombre" };

            Assert.IsFalse(entity1.Equals(entity2));
        }

        [TestMethod]
        public void GetHashCode_SameEmpresaAndNombreUsuario_ReturnsSameResult()
        {
            var empresa = new Empresa { Id = 1 };
            const string nombreUsuario = "user1";
            var entity1 = new Usuario { Empresa = empresa, NombreUsuario = nombreUsuario, Nombre = "Nombre1" };
            var entity2 = new Usuario { Empresa = empresa, NombreUsuario = nombreUsuario, Nombre = "Nombre2" };

            Assert.AreEqual(entity1.GetHashCode(), entity2.GetHashCode());
        }

        [TestMethod]
        public void TienePermiso_EmptyList_False()
        {
            const int permisoId = 1;
            var usuario = new Usuario { Permisos = new List<Permiso>() };

            var result = usuario.TienePermiso(permisoId);

            Assert.IsFalse(result);
        }

        [TestMethod]
        public void TienePermiso_NonPresent_False()
        {
            const int permisoId = 10;
            var usuario = new Usuario
                              {
                                  Permisos = new List<Permiso>
                                                 {
                                                     new Permiso{Id=1},
                                                     new Permiso{Id=2}
                                                 }
                              };

            var result = usuario.TienePermiso(permisoId);

            Assert.IsFalse(result);
        }

        [TestMethod]
        public void TienePermiso_Present_True()
        {
            const int permisoId = 1;
            var usuario = new Usuario
            {
                Permisos = new List<Permiso>
                                                 {
                                                     new Permiso{Id=1},
                                                     new Permiso{Id=2}
                                                 }
            };

            var result = usuario.TienePermiso(permisoId);

            Assert.IsTrue(result);
        }
    }
}
